package day08;

/*
单元测试：属于白盒测试。一般由开发完成，但是有一些项目由测试人员来完成单元测试。
         Junit、Testng测试框架。类似python中的unittest，方便管理测试用例。
         Junit大部分IDE基本都支持。

         JUnit单元测试针对最小的功能单元，也就是函数/方法。

单元测试：
        测试脚本尽量的简单。
        脚本之间是独立的，没有依赖关系。

在开发时，先写测试代码，再编写功能代码，测试驱动开发。TDD Test-Driven Development

测试覆盖技术，怎么设计白盒的测试用例：
    语句覆盖（覆盖度比较弱）：设计尽量少的语句，让程序中的每个语句至少执行一次。
    判定/分支覆盖：判定点，比如(a <= 0 || b <= 0 || c <= 0)是一个判定点。
                  每个判定的true或false至少覆盖一次。也就是每个分支至少覆盖一次。
                  (a <= 0 || b <= 0 || c <= 0) 满足判定覆盖，需要用例：
                  1.输入0 1 1 结果为true
                  2.输入1 1 1 结果为false
    条件覆盖：a <= 0 是一个条件。一个判定点是由一个或者多个条件组成的。
             每个条件true或false至少覆盖一次。
             (a <= 0 || b <= 0 || c <= 0) 满足条件覆盖，需要用例：
             每个条件都能影响判定的结果。
             1. 输入0 1 1，a true b false c false
             2. 输入1 0 1，a false b true c false
             3. 输入1 1 0，a false b false c true
    判定条件覆盖：每个条件的true或false至少覆盖一次，同时每个判定点的true或false也
                 至少覆盖一次。
                  (a <= 0 || b <= 0 || c <= 0) 满足判定条件覆盖，需要用例：
                  1. 输入0 1 1，a true b false c false，判定点结果：true
                  2. 输入1 0 1，a false b true c false，判定点结果：true
                  3. 输入1 1 0，a false b false c true，判定点结果：true
                  4. 输入1 1 1，a false b false c false，判定点结果：false

    条件组合覆盖：每个判定点中各个条件可能的组合都至少覆盖一次。
                 既满足条件覆盖、又满足判定覆盖，以及满足判定条件覆盖。
                 if (a > 0 && b > 0) { }
                 if (a < 0 && b < 0) { } else { }
                 里面有2个判定点，4个判断条件a > 0、b > 0、a < 0 、b < 0。
                 4个条件可能的组合：
                 1. a > 0 && b > 0   a=1, b=1
                 2. a < 0 && b < 0   a=-1, b=-1
                 3. a > 0 && b < 0   a=1, b=-1
                 4. a < 0 && b > 0   a=-1, b=1

    路径覆盖（覆盖度最高）：把流程图画出来，流程图中各个路径至少覆盖一次。

    从上到下覆盖度越来越高。
    覆盖度高，意味着测试设计技术复杂，设计的用例多，执行耗时久。

    实际工作中，结合业务情况，选择一种或多种组合起来使用。
    尽量全面的覆盖代码。

 */
public class Demo01 {
    /*
    根据三角形三边，判断三角形的类型。
     */
    public static String triangleType(int a, int b, int c) {
        if (a <= 0 || b <= 0 || c <= 0) {
            return "参数错误";
        }
        if (a + b > c && a + c > b && b + c > a) {
            if (a == b && b == c) {
                return "等边三角形";
            } else if (a == b || a == c || b == c) {
                return "等腰三角形";
            } else {
                return "一般三角形";
            }
        } else {
            return "不是三角形";
        }
    }
}
